{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torchvision import datasets, transforms\n",
    "from torch.utils.data import Subset\n",
    "import torch.nn as nn\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. define your dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "transform_list = transforms.Compose([transforms.ToTensor(),\n",
    "                                     transforms.Normalize(mean=[0.131], std=[0.289])])\n",
    "dataset = datasets.MNIST(root='/tmp/', train=True, download=True, transform=transform_list)\n",
    "dataset = Subset(dataset, range(2000))\n",
    "\n",
    "loader = torch.utils.data.DataLoader(\n",
    "      dataset=dataset,\n",
    "      batch_size=500,\n",
    "      shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. define your model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_hidden = 2\n",
    "hidden_size = 10\n",
    "device = 'cuda'\n",
    "layers = [nn.Flatten(), nn.Linear(28 * 28, hidden_size), nn.ReLU()] + \\\n",
    "         [nn.Linear(hidden_size, hidden_size), nn.ReLU()] * (n_hidden - 1) + \\\n",
    "         [nn.Linear(hidden_size, 10), nn.LogSoftmax(dim=1)]\n",
    "model = nn.Sequential(*layers).to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# EWC penalty\n",
    "\n",
    "We now compute the matrices coefficients using the generator above. Using different representations we get different performances, and also we use more or less memory. But low memory footprint comes at the price of a less accurate approximation of the FIM, and so the gradient that we get from the penalty can be drastically different."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from nngeometry.object import PMatKFAC, PMatDiag, PMatBlockDiag, PMatDense, PVector\n",
    "from nngeometry.metrics import FIM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Suppose we now train our model on task 1. We want to store the current state of the network using:\n",
    " 1. the current parameter values `v1`\n",
    " 2. the current Fisher Information Matrix `F_XXX`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "v1 = PVector.from_model(model).clone().detach()\n",
    "\n",
    "F_kfac = FIM(model=model,\n",
    "             loader=loader,\n",
    "             representation=PMatKFAC,\n",
    "             n_output=10,\n",
    "             variant='classif_logits',\n",
    "             device='cuda')\n",
    "\n",
    "F_blockdiag = FIM(model=model,\n",
    "                  loader=loader,\n",
    "                  representation=PMatBlockDiag,\n",
    "                  n_output=10,\n",
    "                  variant='classif_logits',\n",
    "                  device='cuda')\n",
    "\n",
    "F_dense = FIM(model=model,\n",
    "             loader=loader,\n",
    "             representation=PMatDense,\n",
    "             n_output=10,\n",
    "             variant='classif_logits',\n",
    "             device='cuda')\n",
    "\n",
    "\n",
    "F_diag = FIM(model=model,\n",
    "             loader=loader,\n",
    "             representation=PMatDiag,\n",
    "             n_output=10,\n",
    "             variant='classif_logits',\n",
    "             device='cuda')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now continue training, using an additional regularizer term, that uses the FIM and the difference betweem the current parameter value and `v1`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "v_current = PVector.from_model(model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "you can now compute a regularizer scalar object and backward through it"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(torch.Size([10, 784]),\n",
       "  tensor([[0., 0., 0.,  ..., 0., 0., 0.],\n",
       "          [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "          [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "          ...,\n",
       "          [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "          [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "          [0., 0., 0.,  ..., 0., 0., 0.]], device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], device='cuda:0')),\n",
       " (torch.Size([10, 10]),\n",
       "  tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], device='cuda:0')),\n",
       " (torch.Size([10, 10]),\n",
       "  tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "          [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], device='cuda:0'))]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regularizer_dense = F_dense.vTMv(v_current - v1)\n",
    "regularizer_dense.backward()\n",
    "[(p.size(), p.grad) for p in model.parameters()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "note that in this case all gradients stay at `0`, because `v_current = v1`, so for the purpose of this example, we will modify the value of `v_current`. You can think of this modification as resulting from SGD updates on the first iterations of training on task 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "for p in model.parameters():\n",
    "    p.data.add_(torch.randn_like(p))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now recompute the gradients from the regularizer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(torch.Size([10, 784]),\n",
       "  tensor([[-0.0208, -0.0208, -0.0208,  ..., -0.0208, -0.0208, -0.0208],\n",
       "          [ 0.0048,  0.0048,  0.0048,  ...,  0.0048,  0.0048,  0.0048],\n",
       "          [-0.0100, -0.0100, -0.0100,  ..., -0.0100, -0.0100, -0.0100],\n",
       "          ...,\n",
       "          [-0.0083, -0.0083, -0.0083,  ..., -0.0083, -0.0083, -0.0083],\n",
       "          [ 0.0108,  0.0108,  0.0108,  ...,  0.0108,  0.0108,  0.0108],\n",
       "          [ 0.0092,  0.0092,  0.0092,  ...,  0.0092,  0.0092,  0.0092]],\n",
       "         device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([ 4.5806e-02, -1.0648e-02,  2.2162e-02,  1.6513e-02,  5.7909e-02,\n",
       "           6.4793e-05,  3.5788e-02,  1.8260e-02, -2.3724e-02, -2.0362e-02],\n",
       "         device='cuda:0')),\n",
       " (torch.Size([10, 10]),\n",
       "  tensor([[ 1.2742e-02,  1.0406e-02,  3.1267e-03,  3.2303e-03,  5.1789e-02,\n",
       "           -4.6293e-03,  2.0001e-02,  2.7142e-02, -2.9179e-03,  2.2821e-03],\n",
       "          [ 1.3446e-04, -2.6562e-06,  1.6336e-04,  3.7881e-04,  9.9114e-05,\n",
       "           -8.8303e-05, -2.3306e-06, -9.3934e-05, -7.7477e-06, -9.0598e-05],\n",
       "          [ 1.7525e-03,  4.7784e-04,  2.2628e-04,  1.5980e-03,  2.9561e-04,\n",
       "            2.2799e-04,  1.0511e-03,  6.7894e-04,  2.8894e-06,  4.9605e-05],\n",
       "          [-3.0858e-02, -2.4327e-02, -5.8150e-02, -9.0733e-02, -4.4649e-02,\n",
       "           -5.6671e-02, -6.2674e-02, -1.5258e-01, -3.0744e-02, -1.6341e-02],\n",
       "          [-2.6570e-04,  1.3920e-04,  1.9087e-03,  3.5701e-03,  1.7175e-04,\n",
       "            5.6789e-04, -2.5482e-04, -4.7392e-04,  1.0735e-04,  0.0000e+00],\n",
       "          [ 4.4952e-03, -1.2791e-04,  1.1235e-03, -1.2388e-03, -1.9395e-03,\n",
       "            5.1634e-03, -1.3051e-03,  3.2585e-03,  2.2665e-03,  9.3090e-04],\n",
       "          [ 2.9071e-04, -2.1049e-03, -5.4728e-03, -2.1352e-03, -9.2929e-03,\n",
       "           -1.3957e-02, -4.9572e-03, -9.9620e-03, -1.7607e-03, -5.4025e-03],\n",
       "          [-2.5281e-04, -2.3634e-05, -3.3181e-04,  1.1062e-03,  3.7012e-04,\n",
       "           -1.8953e-03, -1.3059e-04, -6.9135e-04, -9.5416e-04,  0.0000e+00],\n",
       "          [ 2.1812e-02,  4.6718e-03,  3.1983e-02,  6.1871e-02,  2.5090e-02,\n",
       "            1.6847e-02,  4.1718e-02,  7.3949e-02,  8.6315e-03, -4.5461e-05],\n",
       "          [ 1.4132e-03,  1.4658e-03,  3.1491e-03,  3.1344e-05,  1.0736e-03,\n",
       "            8.8975e-03,  2.2659e-03,  5.2229e-03,  4.6408e-03,  3.2829e-04]],\n",
       "         device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([ 4.2960e-02, -4.1743e-05,  2.2201e-03, -2.7967e-01,  3.1247e-03,\n",
       "           7.2282e-03, -2.7274e-02, -4.4046e-04,  1.1885e-01,  1.0478e-02],\n",
       "         device='cuda:0')),\n",
       " (torch.Size([10, 10]),\n",
       "  tensor([[ 4.2419e-03,  1.5575e-04,  7.2518e-04,  2.2585e-02,  4.3045e-04,\n",
       "            4.4340e-04,  3.2133e-03,  5.5891e-04,  2.0132e-02,  1.6430e-03],\n",
       "          [-3.7460e-03,  4.3557e-05, -6.6224e-04, -1.6589e-02, -7.6975e-05,\n",
       "           -2.0923e-03, -2.3986e-03, -1.9502e-04, -1.9708e-02, -1.9510e-03],\n",
       "          [-2.2682e-03,  5.0514e-05,  2.5061e-04,  7.2641e-04,  3.1995e-05,\n",
       "            9.8956e-04, -5.2752e-04,  8.3125e-05,  1.1471e-03, -3.2219e-05],\n",
       "          [-1.2197e-03,  5.7100e-05, -4.5374e-04,  1.2554e-03,  1.6581e-04,\n",
       "           -8.7647e-04,  2.9750e-03,  3.3045e-04, -1.4657e-02,  7.0058e-05],\n",
       "          [ 2.1627e-03,  2.8043e-06,  1.3273e-03,  2.0213e-02,  5.1129e-04,\n",
       "            4.3876e-03,  1.8504e-03,  2.3725e-04,  3.6006e-02,  3.1575e-03],\n",
       "          [ 2.1007e-03, -1.5794e-04,  3.5303e-04, -9.9691e-03, -4.7493e-04,\n",
       "            7.9263e-04, -2.1785e-03, -3.2673e-04,  3.4271e-03, -5.0454e-04],\n",
       "          [ 1.1373e-03, -2.6321e-05, -7.6306e-04, -1.5020e-02, -3.3916e-04,\n",
       "           -2.8306e-03, -2.5831e-03, -3.9173e-04, -1.8057e-02, -1.7200e-03],\n",
       "          [-1.5064e-03, -3.2726e-05,  6.7799e-04,  3.4985e-02,  5.2471e-04,\n",
       "            2.7483e-03,  5.1149e-03,  6.0476e-04,  3.3382e-02,  3.1765e-03],\n",
       "          [-2.7876e-03, -9.9469e-05, -1.1048e-03, -1.3947e-02, -3.6097e-04,\n",
       "           -2.0401e-03,  1.0555e-03,  8.6967e-05, -2.6213e-02, -1.3492e-03],\n",
       "          [ 1.8852e-03,  6.7317e-06, -3.5028e-04, -2.4239e-02, -4.1222e-04,\n",
       "           -1.5220e-03, -6.5214e-03, -9.8798e-04, -1.5458e-02, -2.4901e-03]],\n",
       "         device='cuda:0')),\n",
       " (torch.Size([10]),\n",
       "  tensor([ 0.2491, -0.2022,  0.0036, -0.0766,  0.3134, -0.0113, -0.1660,  0.3311,\n",
       "          -0.2389, -0.2023], device='cuda:0'))]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regularizer_dense = F_dense.vTMv(v_current - v1)\n",
    "regularizer_dense.backward()\n",
    "[(p.size(), p.grad) for p in model.parameters()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Comparison of regularization obtained using different representations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.zero_grad()\n",
    "regularizer_dense = F_dense.vTMv(v_current - v1)\n",
    "regularizer_dense.backward()\n",
    "g_dense = torch.cat([p.grad.view(-1) for p in model.parameters()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.zero_grad()\n",
    "regularizer_bd = F_blockdiag.vTMv(v_current - v1)\n",
    "regularizer_bd.backward()\n",
    "g_bd = torch.cat([p.grad.view(-1) for p in model.parameters()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.zero_grad()\n",
    "regularizer_kfac = F_kfac.vTMv(v_current - v1)\n",
    "regularizer_kfac.backward()\n",
    "g_kfac = torch.cat([p.grad.view(-1) for p in model.parameters()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.zero_grad()\n",
    "regularizer_diag = F_diag.vTMv(v_current - v1)\n",
    "regularizer_diag.backward()\n",
    "g_diag = torch.cat([p.grad.view(-1) for p in model.parameters()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Compare 100 elements of the gradient (first layer)')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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q65i1apVfPbZZyQkJLBp0yZSUlLo27cvN910EwUFBdxwww38+OOP9OrVi+uvv56XX36Zu+66C4BWrVrxyy+/8NJLL/HUU0/xxhtv0KdPHxYvXkxgYCBz587lz3/+M//973+PYk+rE0nRzp0c+OdjlGZk0vqO3zV2do5rpTm57Dj7bNreew/RkyfX+/K1JNEAOnXqVP4q72uvvZaffvqp0vSVK1cybtw4WrduTWBgINdccw2LFi3i559/5vTTT6dr164AtGjRonyed999l++++45PP/30sAABsGTJEq666ioArrvuOq/5Ki4uZtq0aQwYMIApU6awadMmAH766SemTJmCy+WiXbt2nHHGGYANdl27dqVXr14ATJ06lUWLFpUv75JLLgFg6NChJCQkAJCZmcmUKVPo378/v//979m4cWPtdp46IRXu3AlA3ooVjZyT41/Rzh2UpqXhCg/3y/KbVEmiujt+fxGRIw4fjQEDBrB27VoSExPLg0h1661qxowZtG3blnXr1uF2uwkNDa1TnsqCVUBAACUlJQD87W9/44wzzuDzzz8nISGBcePG1Wkd6sRQtHMXAPnr1uEuKMBVx3OvKSvcYQNucLfuflm+liQawJ49e1i2bBkA77//PmPGjKk0ffjw4SxcuJCDBw9SWlrKBx98wNixYxk5ciSLFi1i1y77hfKsbho8eDCvvvoqF154IcnJyYetc/To0Xz44YeAfdusN5mZmbRv3x6Xy8WsWbMoLS0tn/e///0vbrebAwcOsGDBAgB69+5NQkJC+WvJZ82axdixY4+47ZmZmXTs2BGAmTNnHjGtajqKnHPaFBeTv2ZNI+fm+Fa0YzsEBRHcuZNflq9BogH07t2bF198kb59+5Kens5tt91WaXr79u15/PHHOeOMMxg4cCBDhw5l8uTJtG7dmtdee41LLrmEgQMHcsUVV1Sab8yYMTz11FOcd955HDx4sNK0Z599lhdffJEBAwaQlJTkNV/Tp0/nnXfeYeDAgWzZsoVwp7h66aWXEhsbS79+/bj22msZMmQI0dHRhIaG8vbbbzNlyhQGDBiAy+Xi1ltvPeK233PPPdx///0MHjy4vHShVOGunYT27w8BAeQuX97Y2TmuFe7YSUhcFyTQPxVD+qpw5VVOTg4REREcOnSI4cOHs2TJEtq1a9cg69ZjdmIzxrBtxEiizjuX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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(g_kfac[:100].cpu().numpy(), label='kfac')\n",
    "plt.plot(g_diag[:100].cpu().numpy(), label='diag')\n",
    "plt.plot(g_dense[:100].cpu().numpy(), label='dense')\n",
    "plt.plot(g_bd[:100].cpu().numpy(), label='block diagonal')\n",
    "plt.legend()\n",
    "plt.title('Compare 100 elements of the gradient (first layer)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Compare 100 elements of the gradient (last layer)')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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qqzl1cG69vgC8K8uKDcneJ7H+eefz3777cc555xDfX3rWekfeOABKioqmDhxItdc0zTmzzPPPMPUqVOZNGkSxx13XKvt7rjjDk4++WQaGppPfPzxxx8zY8YMKioq+O53v9u4PvuJY8WKFRxxxBFMnTqVqVOnMnfuXMC+5XfFFVcwfvx4TjjhBE455ZTGH4nnnnuOKVOmUFFRwaWXXto44Nvo0aP5wQ9+wNSpU6moqGh82/f1119nxowZTJkyhUMPPbRxaGhF6asYY3Z4tEzHB3Hcxgif+rpWeTzfa5zHtictnR5901ZELgCmAUe1k345cDnAyJEjO9zX+p/+lMTirh12ILrfeAZfd12HeT744APuuusuDjvsMC699FJ+//vf8+1vf7sxfe3atVxzzTW88cYblJWVceKJJ/LYY49x2GGHcdlllzF79mzGjBnD1q3NW+5/97vf8d///pfHHnus2WBrAF/72tf4yle+wkUXXcRtt93WZr0GDhzIf//7X2KxGEuXLuW8885jwYIF/OMf/2DFihUsWrSIjRs3st9++3HppZcSj8e55JJLeO6559h333256KKL+MMf/sDXv/51AAYMGMCbb77J73//e26++WbuvPNOxo8fz5w5cwiFQjz77LNcd911PPLIIztxphWld5DyU/jGb/y8PdJpL4jwXZKBh2/irYNCz/eIuTHqvfpe12i7BhiRtTw8WNcMETkeuB6YaYxpc2ZfY8ztxphpxphp5eXlXVC1rmfEiBGNwxdfcMEFvPzyy83S58+fz9FHH015eTmhUIjzzz+f2bNn89prr3HkkUcyZswYAPr169e4zZ///Gf+9a9/8fDDD7cSe4BXXnmF8847D4ALL7ywzXqlUikuu+wyKioqmDVrFosWLQLg5ZdfZtasWTiOw+DBgznmmGMA+8M1ZswY9t13X8AO9TB79uzG/Z111lkAHHjggaxYsQKAqqoqZs2axcSJE/nGN77B+++/v2MnT1F6GZnoHjoXiadS9biBh+/HbIgv8YZW+TzfIxaKAb1vLJ35wFgRGYMV+s8Cn8vOICJTgD8BJxljWr9nvBNsLxLvLkSkw+WdoaKigoULF7J69erGH4TtlduSW265hUGDBvH222/j+z6xWGyX6pT54XFdF8+zN/r3vvc9jjnmGB599FFWrFjB0UcfvUtlKMruTsa/h04Kvtdg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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(g_kfac[-100:].cpu().numpy(), label='kfac')\n",
    "plt.plot(g_diag[-100:].cpu().numpy(), label='diag')\n",
    "plt.plot(g_dense[-100:].cpu().numpy(), label='dense')\n",
    "plt.plot(g_bd[-100:].cpu().numpy(), label='block diagonal')\n",
    "# plt.ylim(-.01, .01)\n",
    "plt.legend()\n",
    "plt.title('Compare 100 elements of the gradient (last layer)')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# KFAC and Batch norm layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the case of the KFAC representation, it is not clear what to do with batch norm parameters. If you want to be able to use batch norm layers, you should instead mix representations. You can for instance use the block diagonal representation for batch norm layers, and still use KFAC for the linear layers.\n",
    "\n",
    "Here is how, let us start by defining a new network with batch norm layers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "layers = [nn.Flatten(), nn.Linear(28 * 28, hidden_size), nn.ReLU()] + \\\n",
    "         [nn.Linear(hidden_size, hidden_size), nn.BatchNorm1d(hidden_size), nn.ReLU()] * (n_hidden - 1) + \\\n",
    "         [nn.Linear(hidden_size, 10), nn.LogSoftmax(dim=1)]\n",
    "model = nn.Sequential(*layers).to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now create 2 different layer collections, one that will contain all linear layers, the other ones only batch norm layers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from nngeometry.layercollection import LayerCollection\n",
    "\n",
    "layer_collection_bn = LayerCollection()\n",
    "layer_collection_linear = LayerCollection()\n",
    "\n",
    "for mod in layers:\n",
    "    if type(mod) in [torch.nn.modules.linear.Linear]:\n",
    "        layer_collection_linear.add_layer_from_model(model, mod)\n",
    "    elif type(mod) in [torch.nn.modules.batchnorm.BatchNorm1d]:\n",
    "        layer_collection_bn.add_layer_from_model(model, mod)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now create our 2 representations.\n",
    "\n",
    "Note that both representations do not use the same layer collection, even if they come from the same model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((20, 20), (8070, 8070))"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F_linear_kfac = FIM(layer_collection=layer_collection_linear,\n",
    "                    model=model,\n",
    "                    loader=loader,\n",
    "                    representation=PMatKFAC,\n",
    "                    n_output=10,\n",
    "                    variant='classif_logits',\n",
    "                    device='cuda')\n",
    "\n",
    "F_bn_blockdiag = FIM(layer_collection=layer_collection_bn,\n",
    "                     model=model,\n",
    "                     loader=loader,\n",
    "                     representation=PMatBlockDiag,\n",
    "                     n_output=10,\n",
    "                     variant='classif_logits',\n",
    "                     device='cuda')\n",
    "\n",
    "F_bn_blockdiag.size(), F_linear_kfac.size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "v_current = PVector.from_model(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor(0.3414, device='cuda:0', grad_fn=<AddBackward0>),\n",
       " tensor(0.1395, device='cuda:0', grad_fn=<AddBackward0>))"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F_linear_kfac.vTMv(v_current), F_bn_blockdiag.vTMv(v_current)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can create a new regularizer as the sum of the contributions of linear layers and batch norm layers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "regularizer = F_linear_kfac.vTMv(v_current) + F_bn_blockdiag.vTMv(v_current)\n",
    "\n",
    "model.zero_grad()\n",
    "regularizer.backward()\n",
    "g_with_bn = torch.cat([p.grad.view(-1) for p in model.parameters()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7eff5b3b3350>]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(g_with_bn.cpu().numpy())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
